package com.nccsjz.back.section.service;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import utils.ConfigUtils;
import utils.FileUtils;

import com.nccsjz.back.section.dao.SectionDAO;
import com.nccsjz.back.section.utils.LevelOneUtils;
import com.nccsjz.back.section.utils.LevelTwoUtils;
import com.nccsjz.base.BaseService;
import com.nccsjz.pojo.Section;
import com.nccsjz.utils.CardException;

public class SectionService extends BaseService {

	/**
	 * initLevelOnes方法用于初始化一级栏目
	 * 
	 * @param sections
	 *            Section[] 一级栏目数组
	 * @throws SQLException
	 * @throws IOException
	 */
	public void initLevelOnes(Section[] sections) throws SQLException,
			IOException {
		try {
			openCon();
			SectionDAO sectionDAO = new SectionDAO(con);
			con.setAutoCommit(false);
			for (Section s : sections) {
				if (null == sectionDAO.queryByTitle(s.getTitle())) {
					sectionDAO.insertLevelOne(s);
				}
			}
			con.commit();
		} catch (SQLException sqle) {
			con.rollback();
		} finally {
			closeCon();
		}
	}

	/**
	 * listLevelOne方法用于输出一级栏目列表
	 * 
	 * @return 一级栏目列表
	 * @throws SQLException
	 */
	public List<Section> listLevelOne() throws SQLException {
		List<Section> levelOnes = null;
		try {
			openCon();
			levelOnes = new SectionDAO(con).queryLevelOne();
		} finally {
			closeCon();
		}
		return levelOnes;
	}

	/**
	 * listLevelTwo方法用于输出二级栏目列表
	 * 
	 * @return 二级栏目列表
	 * @throws SQLException
	 * @throws IOException
	 */
	public List<Section> listLevelTwo(Long levelOneId) throws SQLException,
			IOException {
		List<Section> levelTwos = null;
		try {
			openCon();
			levelTwos = new SectionDAO(con).queryLevelTwo(levelOneId);
		} finally {
			closeCon();
		}
		return levelTwos;
	}

	/**
	 * findById方法根据编号查询栏目信息
	 * 
	 * @param sectionId
	 * @return 栏目对象
	 * @throws SQLException
	 * @throws IOException
	 */
	public Section findById(Long id) throws SQLException, IOException {
		Section section = null;
		try {
			openCon();
			section = new SectionDAO(con).queryById(id);
		} finally {
			closeCon();
		}
		return section;
	}

	/**
	 * addLevelOne方法用于添加一级栏目信息
	 * 
	 * @param section
	 *            栏目对象
	 * @param levelOnePath
	 *            一级栏目逻辑路径
	 * @param levelOneRealDirPath
	 *            一级栏目物理路径
	 * @param levelOneJsRealPath
	 *            一级栏目js文件路径
	 * @param levelOneJsRealFileName
	 *            一级栏目js文件名
	 * @throws Exception
	 */
	public void addLevelOne(Section section, String levelOneRealDirPath,
			String levelOneJsRealFileName) throws Exception {
		try {
			openCon();
			con.setAutoCommit(false);

			SectionDAO sectionDAO = new SectionDAO(con);
			sectionDAO.insertLevelOne(section);
			List<Section> dbSections = sectionDAO.queryLevelOne();
			// 创建一级栏目目录
			FileUtils.makeDir(levelOneRealDirPath);
			// 创建levelone.js文件
			LevelOneUtils.createLevelOneSectionsJSFile(levelOneJsRealFileName,
					dbSections, LevelOneUtils.getStaticLevelOnesInfo());
			con.commit();
		} catch (Exception e) {
			e.printStackTrace();
			con.rollback();
			throw e;
		} finally {
			closeCon();
		}
	}

	/**
	 * addLevelTwo方法用于添加二级栏目信息
	 * 
	 * @param section
	 * @throws Exception
	 */
	public void addLevelTwo(Section section, String levelTwoRealPathJsFileName,
			String staticRealPathFileName, String templateRealPathFileName,
			String levelOneJsRealFileName) throws Exception {
		try {
			openCon();
			con.setAutoCommit(false);
			SectionDAO sectionDAO = new SectionDAO(con);
			// 添加二级栏目
			sectionDAO.insertLevelTwo(section);
			// 根据编号查找最早插入的二级栏目
			Section levelTwo = sectionDAO
					.queryMinInsertDateLevelTwoByParentId(section.getParentId());
			// 更新所属一级栏目的fileName
			Section levelOne = sectionDAO.queryById(levelTwo.getParentId());
			levelOne.setFileName(levelTwo.getFileName());
			sectionDAO.updateSection(levelOne);			
			// 在指定目录下生成二级栏目js文件
			List<Section> levelTwos = sectionDAO.queryLevelTwo(section
					.getParentId());
			LevelTwoUtils.createLevelTwoJsFile(levelTwoRealPathJsFileName,
					levelTwos);
			// 生成静态文件
			if (section.getStatus() == 0) {
				LevelTwoUtils.createLevelTwoStaticFile(
						templateRealPathFileName, staticRealPathFileName,
						new String[] { ConfigUtils.getAppConfig("titleFlag"),
								ConfigUtils.getAppConfig("contentFlag") },
						new String[] { section.getTitle(),
								section.getFileContent() });
			}
			// 重新生成一级栏目js文件
			List<Section> levelOnes = sectionDAO.queryLevelOne();
			LevelOneUtils.createLevelOneSectionsJSFile(levelOneJsRealFileName,
					levelOnes, LevelOneUtils.getStaticLevelOnesInfo());
			con.commit();
		} catch (Exception e) {
			con.rollback();
			e.printStackTrace();
			throw e;
		} finally {
			closeCon();
		}
	}
	
	
	/**
	 * editLevelTwo方法用于编辑二级栏目
	 * 
	 * @param section
	 * @param levelTwoRealPathJsFileName
	 * @param orgStaticRealPathFileName
	 * @param staticRealPathFileName
	 * @param templateRealPathFileName
	 * @param levelOneJsRealFileName
	 * @throws Exception
	 */
	public void editLevelTwo(Section section,
			String levelTwoRealPathJsFileName,
			String orgStaticRealPathFileName, String staticRealPathFileName,
			String templateRealPathFileName, String levelOneJsRealFileName)
			throws Exception {
		try {
			openCon();
			con.setAutoCommit(false);
			SectionDAO sectionDAO = new SectionDAO(con);
			// 更新二级栏目
			sectionDAO.updateSection(section);
			// 根据编号查找最早插入的二级栏目
			Section levelTwo = sectionDAO
					.queryMinInsertDateLevelTwoByParentId(section.getParentId());
			// 更新所属一级栏目的fileName
			Section levelOne = sectionDAO.queryById(levelTwo.getParentId());
			levelOne.setFileName(levelTwo.getFileName());
			sectionDAO.updateSection(levelOne);						
			// 删除原来的静态文件
			if (orgStaticRealPathFileName.substring(
					orgStaticRealPathFileName.lastIndexOf(".") + 1).equals(
					"html")) {
				FileUtils.deleteFile(orgStaticRealPathFileName);
			}
			// 只对静态文件操作
			if (section.getStatus() == 0) {
				// 生成新的静态文件
				LevelTwoUtils.createLevelTwoStaticFile(
						templateRealPathFileName, staticRealPathFileName,
						new String[] { ConfigUtils.getAppConfig("titleFlag"),
								ConfigUtils.getAppConfig("contentFlag") },
						new String[] { section.getTitle(),
								section.getFileContent() });
			}
			// 在指定目录下生成二级栏目js文件
			List<Section> levelTwos = sectionDAO.queryLevelTwo(section
					.getParentId());
			LevelTwoUtils.createLevelTwoJsFile(levelTwoRealPathJsFileName,
					levelTwos);
			// 重新生成一级栏目js文件
			List<Section> levelOnes = sectionDAO.queryLevelOne();
			LevelOneUtils.createLevelOneSectionsJSFile(levelOneJsRealFileName,
					levelOnes, LevelOneUtils.getStaticLevelOnesInfo());
			con.commit();
		} catch (Exception e) {
			con.rollback();
			e.printStackTrace();
			throw e;
		} finally {
			closeCon();
		}
	}

	/**
	 * deleteLevelOne方法根据栏目编号删除一级标题
	 * 
	 * @param id
	 *            Long 一级标题的编号
	 * @throws Exception
	 */
	public void deleteLevelOne(Long id, String levelOneRealDirPath,
			String levelOneJsRealFileName) throws Exception {
		try {
			openCon();
			SectionDAO sectionDAO = new SectionDAO(con);
			con.setAutoCommit(false);
			// 删除一级栏目包含的二级栏目
			sectionDAO.deleteByParentId(id);
			// 删除一级栏目
			sectionDAO.delete(id);
			List<Section> dbSections = sectionDAO.queryLevelOne();
			// 重新生成levelone.js文件
			LevelOneUtils.createLevelOneSectionsJSFile(levelOneJsRealFileName,
					dbSections, LevelOneUtils.getStaticLevelOnesInfo());
			// 删除服务器对应的目录文件
			FileUtils.deleteDir(levelOneRealDirPath);
			con.commit();
		} catch (Exception e) {
			con.rollback();
			e.printStackTrace();
			throw e;
		} finally {
			closeCon();
		}
	}

	/**
	 * deleteLevelTwo方法根据编号删除二级栏目的信息
	 * 
	 * @param id
	 * @throws Exception
	 */
	public void deleteLevelTwo(Long id, String levelTwoFileRealName,
			String levelOneRealDir, String levelTwoJsRealFileName,
			String levelOneJsRealFileName) throws Exception {
		try {
			openCon();
			con.setAutoCommit(false);
			SectionDAO sectionDAO = new SectionDAO(con);
			// 查询二级栏目
			Section levelTwo = sectionDAO.queryById(id);
			// 删除二级栏目
			sectionDAO.delete(id);
			// 检查是否还有二级栏目
			List<Section> levelTwoSections = sectionDAO.queryLevelTwo(levelTwo
					.getParentId());
			Section levelOne = sectionDAO.queryById(levelTwo.getParentId());
			if (levelTwoSections.size() == 0) {// 如果没有二级栏目则将一级栏目的fileName置空
				levelOne.setFileName(null);
				sectionDAO.updateSection(levelOne);
			} else {
				Section two = sectionDAO
						.queryMinInsertDateLevelTwoByParentId(levelTwo
								.getParentId());
				levelOne.setFileName(two.getFileName());
				sectionDAO.updateSection(levelOne);
			}
			// 如果没有二级栏目则删除二级栏目所在目录下的所有文件
			/*
			 * if(levelTwoSections.size() == 0){ FileUtils.deleteDirFiles(new
			 * File(levelOneRealDir)); }else{
			 * FileUtils.deleteFile(levelTwoFileRealName);//删除指定的二级栏目文件 }
			 */
			// 如果是静态文件，则删除指定文件(注：动态文件不能通过后台管理程序删除）
			if (levelTwo.getStatus() == 0) {
				FileUtils.deleteFile(levelTwoFileRealName);
			}

			// 重新生成leveltwo.js
			// 查询删除后的二级栏目列表
			// List<Section> levelTwos =
			// sectionDAO.queryLevelTwo(levelTwo.getParentId());
			LevelTwoUtils.createLevelTwoJsFile(levelTwoJsRealFileName,
					levelTwoSections);
			// 重新生成levelone.js
			List<Section> dbSections = sectionDAO.queryLevelOne();
			// 重新生成levelone.js文件
			LevelOneUtils.createLevelOneSectionsJSFile(levelOneJsRealFileName,
					dbSections, LevelOneUtils.getStaticLevelOnesInfo());
			con.commit();
		} catch (Exception e) {
			con.rollback();
			e.printStackTrace();
			throw e;
		} finally {
			closeCon();
		}
	}

	/**
	 * findByTitle方法根据标题查找一级栏目
	 * 
	 * @param title
	 * @return
	 * @throws SQLException
	 * @throws IOException
	 */
	public Section findByTitle(String title) throws SQLException, IOException {
		Section section = null;
		try {
			openCon();
			section = new SectionDAO(con).queryByTitle(title);
		} finally {
			closeCon();
		}
		return section;
	}

	/**
	 * findLevelOneByTitleAndFolderName方法根据标题和文件夹名称查询一级栏目对象
	 * 
	 * @param title
	 * @param folderName
	 * @return
	 * @throws SQLException
	 * @throws IOException
	 */
	public Section findLevelOneByTitleOrFolderName(String title,
			String folderName) throws SQLException, IOException {
		Section section = null;
		try {
			openCon();
			section = new SectionDAO(con).queryLevelOneByTitleOrFolderName(
					title, folderName);
		} finally {
			closeCon();
		}
		return section;
	}

	/**
	 * findLevelTwoByTitleAndFileName根据标题和文件名查询二级标题内容
	 * 
	 * @param title
	 * @param fileName
	 * @return
	 * @throws SQLException
	 * @throws IOException
	 */
	public Section findLevelTwoByTitleOrFileNameAndParentId(String title,
			String fileName, Long parentId) throws SQLException, IOException {
		Section section = null;
		try {
			openCon();
			section = new SectionDAO(con)
					.queryLevelTwoByTitleOrFileNameAndParentId(title, fileName,
							parentId);
		} finally {
			closeCon();
		}
		return section;
	}

	/**
	 * editLevelOneFolder方法用于更改一级栏目的目录名
	 * 
	 * @param section
	 * @throws SQLException
	 * @throws IOException
	 * @throws CardException
	 */
	public void editLevelOne(Section section, String sourceDirName,
			String targetDirName, String oldFolderName,String levelOneJsRealFileName,
			String levelTwoJsRealFileName) throws SQLException, IOException,
			CardException {
		try {
			openCon();
			con.setAutoCommit(false);
			SectionDAO sectionDAO = new SectionDAO(con);
			// 更新一级栏目
			sectionDAO.updateSection(section);
			// 更新二级栏目
			List<Section> levelTwos = sectionDAO.queryLevelTwo(section
					.getSectionId());
			for (Section s : levelTwos) {
				s.setFileName(s.getFileName().replace(oldFolderName, s.getFolderName()));
				s.setFolderName(null);
				sectionDAO.updateSection(s);
			}
			// 查询一级栏目信息
			List<Section> dbSections = sectionDAO.queryLevelOne();
			// 修改一级栏目目录名
			FileUtils.renameDir(sourceDirName, targetDirName);
			// 重新生成levelOne.js文件
			LevelOneUtils.createLevelOneSectionsJSFile(levelOneJsRealFileName,
					dbSections, LevelOneUtils.getStaticLevelOnesInfo());
			// 在相对应的目录下重新创建leveltwo.js
			// 重新查询更新过后的二级栏目
			levelTwos = sectionDAO.queryLevelTwo(section.getSectionId());
			LevelTwoUtils.createLevelTwoJsFile(levelTwoJsRealFileName,
					levelTwos);
			con.commit();
		} catch (SQLException sqle) {
			con.rollback();
			throw sqle;
		} finally {
			closeCon();
		}
	}
}
